package com.ideaaedi.springcloud.jd.user.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ideaaedi.springcloud.jd.commonds.entity.PageInfo;
import com.ideaaedi.springcloud.jd.commonds.entity.user.po.SysFilePO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.req.SysFileListReqVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.resp.SysFileBatchUploadRespVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.resp.SysFileDetailRespVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.resp.SysFileDownloadImgRespVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.resp.SysFileListRespVO;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Set;

/**
 * <p>
 * 系统-文件 服务类
 * </p>
 *
 * @author <font size = "20" color = "#3CAA3C"><a href="https://gitee.com/JustryDeng">JustryDeng</a></font> <img src="https://gitee.com/JustryDeng/shared-files/raw/master/JustryDeng/avatar.jpg" />
 * @since 2021.0.5.B
 */
public interface SysFileService extends IService<SysFilePO> {
    
    
    /**
     * 文件上传
     *
     * @param file 文件
     * @param tenant 上传到的租户域
     *
     * @return 文件详情
     */
    SysFileDetailRespVO upload(MultipartFile file, @Nullable String tenant);
    
    /**
     * 文件上传
     *
     * @param originalFilename 文件名
     * @param fileBytes 文件内容
     * @param tenant 上传到的租户域
     *
     * @return 文件详情
     */
    SysFileDetailRespVO upload(@NonNull String originalFilename, @NonNull byte[] fileBytes, @Nullable String tenant);
    
    /**
     * 文件批量上传
     *
     * @param fileList
     *         文件
     *
     * @return 文件id-文件名
     */
    SysFileBatchUploadRespVO batchUpload(List<MultipartFile> fileList, @Nullable String tenant);
    
    /**
     * 加载文件内容
     *
     * @param fileId 文件id
     *
     * @return 左-文件信息（@NonNull）；右-文件内容字节
     */
    @NonNull
    Pair<SysFilePO, byte[]> loadFile(Long fileId);
    
    /**
     * 图片下载
     *
     * @param fileId 文件id
     *
     * @return 图片信息
     */
    SysFileDownloadImgRespVO downloadImg(Long fileId);
    
    /**
     * 图片批量下载
     *
     * @param fileIds 文件id集合
     *
     * @return 图片信息
     */
    List<SysFileDownloadImgRespVO> batchDownloadImg(Set<Long> fileIds);

    /**
     * 查详情
     *
     * @param id 要查询数据的id
     *
     * @return 数据详情
     */
    @Nullable
    SysFileDetailRespVO detail(Long id);

    /**
     * 查列表
     *
     * @param req 参数
     *
     * @return 数据列表
     */
    PageInfo<SysFileListRespVO> list(SysFileListReqVO req);
}
